#include <stdio.h>
#include <stdlib.h>
#include <qrencode.h>
#include <png.h>
#include <zlib.h>
#include <locale.h>
#if 0
void save_png(const char *filename, QRcode *qrcode) {
    FILE *fp = fopen(filename, "wb");
    if (!fp) {
        perror("Failed to open file for writing");
        return;
    }

    // PNG 文件头
    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    //png_set_compression_level(png, Z_BEST_COMPRESSION);
    png_set_compression_level(png, Z_BEST_COMPRESSION); // 使用 zlib 的常量
        // 定义过滤器权重和成本
    double filter_weights[5] = {0.0}; // 过滤器权重数组
    double filter_costs[5] = {0.0};   // 过滤器成本数组
    png_set_filter_heuristics(png, PNG_FILTER_HEURISTIC_UNWEIGHTED, 5, filter_weights, filter_costs); // 修改此行
    //png_set_filter_heuristics(png, PNG_FILTER_HEURISTIC_UNWEIGHTED, 0, NULL); 
    //int filter_weights[5] = {0}; // 定义一个过滤器权重数组
    //png_set_filter_heuristics(png, PNG_FILTER_HEURISTIC_UNWEIGHTED, filter_weights); // 使用权重数组
    //png_set_filter_heuristics(png, PNG_FILTER_HEURISTIC_UNWEIGHTED, NULL); // 修改此行
    //png_set_filter_heuristic(png, PNG_FILTER_HEURISTIC_UNWEIGHTED);

    png_init_io(png, fp);
    png_set_IHDR(png, info, qrcode->width, qrcode->width, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    png_write_info(png, info);

    // 写入二维码数据
    for (int y = 0; y < qrcode->width; y++) {
        png_bytep row = (png_bytep)malloc(qrcode->width);
        for (int x = 0; x < qrcode->width; x++) {
            row[x] = (qrcode->data[y * qrcode->width + x] & 1) ? 0 : 255; // 黑白反转
        }
        png_write_row(png, row);
        free(row);
    }

    png_write_end(png, NULL);
    fclose(fp);
    png_destroy_write_struct(&png, &info);
}
#endif

void save_png(const char *filename, QRcode *qrcode) {
    FILE *fp = fopen(filename, "wb");
    if (!fp) {
        perror("Failed to open file for writing");
        return;
    }

    // PNG 文件头
    png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    png_infop info = png_create_info_struct(png);
    png_set_compression_level(png, Z_BEST_COMPRESSION); // 使用 zlib 的常量

    // 定义过滤器权重和成本
    double filter_weights[5] = {0.0}; // 过滤器权重数组
    double filter_costs[5] = {0.0};   // 过滤器成本数组
    png_set_filter_heuristics(png, PNG_FILTER_HEURISTIC_UNWEIGHTED, 5, filter_weights, filter_costs); // 修改此行

    png_init_io(png, fp);
    
    // 计算缩放因子
    int scale_factor = 320 / qrcode->width; // 计算缩放因子
    png_set_IHDR(png, info, qrcode->width * scale_factor, qrcode->width * scale_factor, 8, PNG_COLOR_TYPE_GRAY, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    png_write_info(png, info);

    // 写入二维码数据
    for (int y = 0; y < qrcode->width; y++) {
        png_bytep row = (png_bytep)malloc(qrcode->width * scale_factor);
        for (int x = 0; x < qrcode->width; x++) {
            for (int k = 0; k < scale_factor; k++) {
                row[x * scale_factor + k] = (qrcode->data[y * qrcode->width + x] & 1) ? 0 : 255; // 黑白反转
            }
        }
        for (int k = 0; k < scale_factor; k++) {
            png_write_row(png, row); // 写入缩放后的行
        }
        free(row);
    }

    png_write_end(png, NULL);
    fclose(fp);
    png_destroy_write_struct(&png, &info);
}
int main() {
    setlocale(LC_ALL, "zh_CN.UTF-8");
    const char *text = "hello,anyka 2025"; // 要编码的文本
    QRcode *qrcode = QRcode_encodeString(text, 0, QR_ECLEVEL_L, QR_MODE_8, 1);

    if (qrcode) {
        save_png("qrcode.png", qrcode);
        QRcode_free(qrcode);
        printf("QR code generated and saved as 'qrcode.png'\n");
    } else {
        fprintf(stderr, "Failed to generate QR code\n");
    }

    return 0;
}
